#include <iostream>
#include <event2/event.h>
#include <signal.h>
using namespace std;

//sock文件描述符 which事件类型 arg 传递的参数
static void Ctrl_C(int sock, short which, void * arg){
        cout<<"Ctrl_C"<<endl;
}
static void Kill(int sock, short which, void * arg){
        cout<<"Kill"<<endl;

        //手动的添加和删除 实现持久触发 也可以直接设置持久
        event *ev = (event *)arg;
        //判断处于非待决
        //if(!event_pending(ev, EV_SIGNAL, NULL)){
        if(!evsignal_pending(ev, NULL)){//这个和上一句是一样的 只是对event_pending封装了一下
                event_del(ev);
                event_add(ev, NULL);
        }
}
int main(int argc, char const *argv[]){
        event_base *base = event_base_new();
        //添加一个ctrl+c信号事件，处于no pending  
        //evsignal本身就是对event_new 加上了这个参数 EV_SIGNAL|EV_PERSIST
        event *csig = evsignal_new(base, SIGINT, Ctrl_C, base);
        if(!csig){
                cerr<<"SIGINT evsignal_new failed!"<<endl;
                return -1;
        }
        //添加事件到pending
        if(event_add(csig, 0) != 0){
                 cerr<<"SIGINT event_add failed!"<<endl;
                return -1;
        }

        //添加kill信号 不使用evsignal_new使用event_new EV_SIGNAL|EV_PERSIST
        //非持久事件,只进入一次 event_self_cbarg() 传递当前的event
        event *ksig = event_new(base, SIGTERM, EV_SIGNAL,Kill,event_self_cbarg());
        if(!ksig){
                cerr<<"SIGTERM evsignal_new failed!"<<endl;
                return -1;
        }
        //添加事件到pending
        if(event_add(ksig, 0) != 0){
                 cerr<<"SIGTERM event_add failed!"<<endl;
                return -1;
        }

        //进入事件主循环
        event_base_dispatch(base);

        if(csig){
                event_free(csig);
        }

        if(base){
                event_base_free(base);
        }

        return 0;
}